package main

import (
	"os"

	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/config"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/daemon"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/downloader"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/installer"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/logger"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/service"
	"gitee.com/liumou_site/ssh-go-automatic-upgrade/internal/sshconfig"
	"go.uber.org/zap"
)

// main 主函数 - SSH自动升级程序入口
// 示例值: 无参数
func main() {
	// 解析命令行参数
	args := config.ParseArgs()
	if args == nil {
		os.Exit(1)
	}

	// 设置日志
	logger, err := logger.InitLogger(args.LogDir)
	if err != nil {
		zap.L().Error("初始化日志失败", zap.Error(err))
		return
	}
	defer logger.Sync()

	zap.L().Info("SSH自动升级程序启动")

	// 检查root权限
	if os.Geteuid() != 0 {
		zap.L().Error("需要root权限来运行SSH自动升级工具")
		zap.L().Error("请使用sudo或切换到root用户运行此程序")
		os.Exit(1)
	}

	// 智能检测root登录配置
	if args.RootLogin == "auto" {
		configChecker := sshconfig.NewSSHConfigChecker()
		currentStatus, err := configChecker.IsRootLoginEnabled()
		if err == nil {
			if currentStatus {
				args.RootLogin = "yes"
				zap.L().Info("检测到当前root登录配置: 启用")
				zap.L().Info("默认设置为: --root-login yes")
			} else {
				args.RootLogin = "no"
				zap.L().Info("检测到当前root登录配置: 禁用")
				zap.L().Info("默认设置为: --root-login no")
			}
			zap.L().Info("可通过 --root-login yes/no 参数强制设置")
		} else {
			zap.L().Warn("无法检测root登录配置，使用默认值")
		}
	}

	// 智能检测仅密钥登录配置
	if args.KeyOnlyLogin == "auto" {
		configChecker := sshconfig.NewSSHConfigChecker()
		currentStatus, err := configChecker.IsKeyOnlyLoginEnabled()
		if err == nil {
			if currentStatus {
				args.KeyOnlyLogin = "yes"
				zap.L().Info("检测到当前仅密钥登录配置: 启用")
				zap.L().Info("默认设置为: --key-only-login yes")
			} else {
				args.KeyOnlyLogin = "no"
				zap.L().Info("检测到当前仅密钥登录配置: 禁用")
				zap.L().Info("默认设置为: --key-only-login no")
			}
			zap.L().Info("可通过 --key-only-login yes/no 参数强制设置")
		} else {
			zap.L().Warn("无法检测仅密钥登录配置，使用默认值")
		}
	}

	// 检查镜像地址可用性
	zap.L().Info("检查镜像地址可用性")
	mirrorChecker := downloader.NewMirrorChecker(args.SkipTLSVerify)
	mirrorAvailable := mirrorChecker.CheckMirrorAvailability(args.Mirror)
	if !mirrorAvailable {
		zap.S().Errorf("镜像地址不可用: %s", args.Mirror)
		os.Exit(1)
	}
	zap.L().Info("镜像地址检测通过")

	// 检查编译依赖
	zap.L().Info("检查编译依赖")
	dependencyManager := installer.NewDependencyManager()
	depsSuccess, depsMessage := dependencyManager.EnsureDependencies(true)
	if !depsSuccess {
		zap.S().Errorf("依赖检查失败: %s", depsMessage)
		os.Exit(1)
	}
	zap.L().Info("编译依赖检查通过")

	// 如果指定了服务注册参数
	if args.Service {
		// 创建ServiceManager实例并调用服务注册模块
		serviceManager := service.NewServiceManager("ssh-auto-upgrade")
		success := serviceManager.RegisterService(args)
		if success {
			zap.L().Info("服务注册成功")
			os.Exit(0)
		} else {
			zap.L().Error("服务注册失败")
			os.Exit(1)
		}
	}

	// 运行守护进程主循环
	os.Exit(daemon.RunDaemonLoop(args))
}